Locking ডাটাবেসের এমন একটি প্রক্রিয়া যা একাধিক ব্যবহারকারী বা প্রসেস যখন একই ডেটা অ্যাক্সেস বা পরিবর্তন করার চেষ্টা করে, তখন ডেটার সঠিকতা এবং সামঞ্জস্য নিশ্চিত করে। এটি বিশেষত Concurrency Control এর জন্য ব্যবহৃত হয়, যেখানে একই ডেটার উপর একাধিক অপারেশন পারফর্ম করা হয়।
Hibernate এবং JPA-তে Locking প্রধানত দুই প্রকার:
Optimistic Locking ধরে নেয় যে ডেটার উপর কনফ্লিক্ট খুব কম হয়। এটি কোনো লক নেয় না; বরং একটি Version বা Timestamp ফিল্ড ব্যবহার করে ডেটার সামঞ্জস্যতা যাচাই করে।
কাজের পদ্ধতি:
উদাহরণ:
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@Version
private int version;
// Getters and Setters
}
Pessimistic Locking ধরে নেয় যে ডেটার উপর কনফ্লিক্ট হতে পারে এবং ডেটা রিড বা রাইট করার সময় তা লক করে রাখে।
কাজের পদ্ধতি:
উদাহরণ:
// Pessimistic Read Lock
entityManager.lock(product, LockModeType.PESSIMISTIC_READ);
// Pessimistic Write Lock
entityManager.lock(product, LockModeType.PESSIMISTIC_WRITE);
Locking নিশ্চিত করে যে একই ডেটা একাধিক ট্রানজেকশন দ্বারা পরিবর্তিত হলে ডেটা ইনকনসিস্টেন্সি না হয়।
Concurrency এর কারণে ডেটা রেস (যখন একাধিক প্রসেস ডেটা অ্যাক্সেস করে) হতে পারে। Locking এই সমস্যাগুলো প্রতিরোধ করে।
Locking নিশ্চিত করে যে কোনো একটি ট্রানজেকশন শেষ না হওয়া পর্যন্ত অন্য ট্রানজেকশন সেই ডেটা পরিবর্তন করতে পারবে না।
Locking ব্যবহার করে Dirty Read, Non-repeatable Read, এবং Phantom Read এর মতো সমস্যা প্রতিরোধ করা যায়।
বৈশিষ্ট্য | Optimistic Locking | Pessimistic Locking |
---|---|---|
লক প্রক্রিয়া | কোনো লক নেয় না, ভার্সন বা টাইমস্ট্যাম্প ব্যবহার করে | ডেটার উপর সরাসরি লক প্রয়োগ করে |
কনফ্লিক্টের সম্ভাবনা | কম কনফ্লিক্ট থাকলে কার্যকর | বেশি কনফ্লিক্ট থাকলে কার্যকর |
কর্মক্ষমতা (Performance) | ভালো, কারণ লক ব্যবস্থাপনা প্রয়োজন নেই | বেশি রিসোর্স ব্যবহার করে |
ব্যবহারের ক্ষেত্র | বেশি রিড অপারেশন এবং কম কনফ্লিক্ট | বেশি রাইট অপারেশন এবং বেশি কনফ্লিক্ট |
@Entity
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private double balance;
@Version
private int version;
// Getters and Setters
}
@Transactional
public Account withdrawAmount(Long accountId, double amount) {
Account account = entityManager.find(Account.class, accountId, LockModeType.PESSIMISTIC_WRITE);
if (account.getBalance() >= amount) {
account.setBalance(account.getBalance() - amount);
} else {
throw new InsufficientBalanceException("Insufficient balance.");
}
return account;
}
@Transactional
public Account updateAccount(Account updatedAccount) {
try {
return accountRepository.save(updatedAccount);
} catch (OptimisticLockingFailureException e) {
throw new ConcurrentModificationException("The account was updated by another transaction.");
}
}
Locking একটি অপরিহার্য প্রক্রিয়া যা ডেটাবেস ট্রানজেকশন এবং কনকারেন্সি সমস্যাগুলো সমাধান করতে সাহায্য করে। Optimistic Locking এবং Pessimistic Locking এর মধ্যে পার্থক্য বুঝে প্রয়োজন অনুযায়ী ব্যবহার করলে ডেটার অখণ্ডতা এবং সামঞ্জস্যতা বজায় রাখা সহজ হয়।
Read more